# 输出1~20000内的所有素数，按每行5个打印出来
# 思路：筛法求素数，通过yield关键字实现生成器
# 详见个人博客：https://www.edisoncgh.com/archives/724

# 奇数生成器
def _odd_iter():
    n = 1
    while True:
        n += 2
        yield n

# 构造筛选器
def _not_divsible(n):
    return lambda x : x % n > 0

# 筛法素数生成器
def _find_prime():
    yield 2 # 返回第一个素数"2"
    it = _odd_iter()
    while True:
        n = next(it)
        yield n
        it = filter(_not_divsible(n), it) # 根据filter不断产生新的素数

if __name__ == '__main__':
    for i in _find_prime():
        cnt = 0;
        if i <= 20000:
            print(i, end=" ")
            cnt += 1
            # 每五个数换一行
            if cnt % 5 == 0:
                print("\n")